﻿using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Globalization;
using System.IO;
using System.Data;
using AudiPyme.DAL;
using AudiPyme.BLL;
using System.Diagnostics;
using System.Threading;
using Microsoft.Reporting.WebForms;
using System.Windows.Forms;

namespace AudiPyme.UI
{
    public partial class InformeGenerar : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                String NombreUsuario = (String)Session["nombreUsuario"];
                int EmpresaUsuario = UsuariosFactory.EmpresaUsuario(NombreUsuario);
                //Recogemos el ultimo Id de Informe que ha generado la empresa
                int IdInforme = InformesFactory.UltimoIdInformeEmpresa(EmpresaUsuario);
                if (IdInforme != 0)
                {
                    //List<Puntos> LGraficoDatosEmpresa = ActivosEmpresaFactory.ValoresEmpresaInforme(EmpresaUsuario, IdInforme);

                    List<ActivosEmpresa> ListaPrueba = ActivosEmpresaFactory.PruebaRecogeActivosEmpresa(EmpresaUsuario);

                    List<DatosEmpresaInforme> LDatosEmpresa = EmpresaInformeFactory.DatosEmpresa(IdInforme);

                    List<PuntoIntXY> LDatosEmpresaXY = EmpresaInformeFactory.DatosEmpresaInformeXY(IdInforme);

                    List<PuntoDoubleXY> LMadDeseableXY = EmpresaInformeFactory.MadurezDeseableEmpresaInformeXY(IdInforme);

                    List<FechasInforme> LFechas = EmpresaInformeFactory.FechaInforme(IdInforme);

                    List<PuntoDoubleXY> LControlesNivMadurezEmpresa = ControlesEmpresaInformeFactory.ControlesNivelMadurezEmpresaInformeXY(IdInforme);

                    //Lista de los activos de la empresa
                    List<ActivosDatosInforme> LActivosEmpresa = ActivosInformeFactory.RecogeActivosInforme(IdInforme);

                    //Lista de los Activos por Tipo de Activo XY
                    List<PuntoIntXY> LActivosTipoXY = ActivosInformeFactory.ActivosTipoActivoInformeXY(IdInforme);

                    //Lista de los Activos por Valor Estratégico XY
                    List<PuntoIntXY> LActivosValorXY = ActivosInformeFactory.ActivosValorEstrategicoInformeXY(IdInforme);


                    //Lista de Activos por Coste XY
                    List<PuntoIntXY> LActivosCosteXY = ActivosInformeFactory.ActivosCosteInformeXY(IdInforme);

                    //Lista de Controles por Dominio 1 de 2 XY
                    List<PuntoIntXY> LControlesObj1d2XY = ControlesEmpresaInformeFactory.RecogeControlesDominioInforme1de2XY(IdInforme);
                    //Lista de Controles por Dominio 2 de 2 XY
                    List<PuntoIntXY> LControlesObj2d2XY = ControlesEmpresaInformeFactory.RecogeControlesDominioInforme2de2XY(IdInforme);
                    //Lista de Controles de Empresa para la Tabla
                    List<ControlesEmpresaDatosInforme> LControlesTabla = ControlesEmpresaInformeFactory.RecogeControlesInformeTabla(IdInforme);
                    //Lista de Relaciones Seleccionadas por una Empresa 1 de 2 XY
                    List<PuntoIntXY> LRelacionesEmp1de2 = EmpresaInformeFactory.RelacionesInforme1de2XY(IdInforme);
                    //Lista de Relaciones Seleccionadas por una Empresa 2 de 2 XY
                    List<PuntoIntXY> LRelacionesEmp2de2 = EmpresaInformeFactory.RelacionesInforme2de2XY(IdInforme);

                    //Lista para la Tabla de Análisis de Riesgo
                    List<AnalisisRiesgoDatosInforme> LAnalisRiesgoTabla = AnalisisRiesgoFactory.RecogeAnalisRiesgoInforme(IdInforme);

                    //Lista para hacer el Plan de Mejora
                    List<PlanMejoraInforme> LPlanMejoraInforme = PlanMejoraFactory.RecogePlanMejoraInforme(IdInforme);

                    
                    ReportDataSource dataSource = new ReportDataSource();
                    /*
                    dataSource.Name = "DataSet1";
                    dataSource.Value = LGraficoDatosEmpresa;
                    ReportViewer1.LocalReport.DataSources.Add(dataSource);
                     * */


                    dataSource = new ReportDataSource();
                    dataSource.Name = "DataSet2";
                    dataSource.Value = ListaPrueba;
                    ReportViewer1.LocalReport.DataSources.Add(dataSource);

                    dataSource = new ReportDataSource();
                    dataSource.Name = "DataSet3";
                    dataSource.Value = LDatosEmpresa;
                    ReportViewer1.LocalReport.DataSources.Add(dataSource);

                    dataSource = new ReportDataSource();
                    dataSource.Name = "DataSetDatosEmpresaXY";
                    dataSource.Value = LDatosEmpresaXY;
                    ReportViewer1.LocalReport.DataSources.Add(dataSource);

                    //Dataset para la fecha de la portada del informe
                    dataSource = new ReportDataSource();
                    dataSource.Name = "Fechas";
                    dataSource.Value = LFechas;
                    ReportViewer1.LocalReport.DataSources.Add(dataSource);

                    //Gráfico en barra del Nivel de Madurez Actual
                    dataSource = new ReportDataSource();
                    dataSource.Name = "MadDeseableXY";
                    dataSource.Value = LMadDeseableXY;
                    ReportViewer1.LocalReport.DataSources.Add(dataSource);

                    //Gráfico Radial del Nivel de Madurez Deseable
                    dataSource = new ReportDataSource();
                    dataSource.Name = "ControlesNivMadurezEmpresa";
                    dataSource.Value = LControlesNivMadurezEmpresa;
                    ReportViewer1.LocalReport.DataSources.Add(dataSource);

                    //Gráfico de Activos por Tipo de Activo
                    dataSource = new ReportDataSource();
                    dataSource.Name = "ActivosTipoActivoXY";
                    dataSource.Value = LActivosTipoXY;
                    ReportViewer1.LocalReport.DataSources.Add(dataSource);


                    //Gráfico de los Activos por Valor Estratégico
                    dataSource = new ReportDataSource();
                    dataSource.Name = "ActivosValorEstrategicoXY";
                    dataSource.Value = LActivosValorXY;
                    ReportViewer1.LocalReport.DataSources.Add(dataSource);

                    //Gráfico de los Activos por Coste (€)
                    dataSource = new ReportDataSource();
                    dataSource.Name = "ActivosCosteXY";
                    dataSource.Value = LActivosCosteXY;
                    ReportViewer1.LocalReport.DataSources.Add(dataSource);

                    //Tabla de los Activos
                    dataSource = new ReportDataSource();
                    dataSource.Name = "ActivosEmpresaTabla";
                    dataSource.Value = LActivosEmpresa;
                    ReportViewer1.LocalReport.DataSources.Add(dataSource);

                    //Gráfico de Respuestas de Controles por Objetivos de Control 1 de 2
                    dataSource = new ReportDataSource();
                    dataSource.Name = "ControlesDominio1de2XY";
                    dataSource.Value = LControlesObj1d2XY;
                    ReportViewer1.LocalReport.DataSources.Add(dataSource);

                    //Gráfico de Respuestas de Controles por Objetivos de Control 2 de 2
                    dataSource = new ReportDataSource();
                    dataSource.Name = "ControlesDominio2de2XY";
                    dataSource.Value = LControlesObj2d2XY;
                    ReportViewer1.LocalReport.DataSources.Add(dataSource);

                    //Gráfico de Respuestas de Controles por Objetivos de Control 2 de 2
                    dataSource = new ReportDataSource();
                    dataSource.Name = "ControlesEmpresaInformeTabla";
                    dataSource.Value = LControlesTabla;
                    ReportViewer1.LocalReport.DataSources.Add(dataSource);

                    //Gráfico de Relaciones de la Empresa por Tipo de Activo 1 de 2
                    dataSource = new ReportDataSource();
                    dataSource.Name = "RelacionesEmpresa1de2XY";
                    dataSource.Value = LRelacionesEmp1de2;
                    ReportViewer1.LocalReport.DataSources.Add(dataSource);

                    //Gráfico de Relaciones de la Empresa por Tipo de Activo 1 de 2
                    dataSource = new ReportDataSource();
                    dataSource.Name = "RelacionesEmpresa2de2XY";
                    dataSource.Value = LRelacionesEmp2de2;
                    ReportViewer1.LocalReport.DataSources.Add(dataSource);

                    //Tabla de Relaciones de Análisis de Riesgo
                    dataSource = new ReportDataSource();
                    dataSource.Name = "AnalisisRiesgoTabla";
                    dataSource.Value = LAnalisRiesgoTabla;
                    ReportViewer1.LocalReport.DataSources.Add(dataSource);

                    //Tabla de Plan de Mejora
                    dataSource = new ReportDataSource();
                    dataSource.Name = "PlanMejoraTabla";
                    dataSource.Value = LPlanMejoraInforme;
                    ReportViewer1.LocalReport.DataSources.Add(dataSource);

                    String reportName = "rptAnalisisRiesgo.rdlc";
                    ReportViewer1.LocalReport.ReportPath = reportName;
                    //Linea comentada para no generar el Report Viewer 
                    //ReportViewer1.LocalReport.Refresh();

                    //En vez de generar el report viewer generamos el pdf directamente
                    //NOTA: si se quiere volver al ReportViewer, eliminar de aquí al final y descomentar el Refresh del ReportViewer
                    // Variables
                    Warning[] warnings;
                    string[] streamIds;
                    string mimeType = string.Empty;
                    string encoding = string.Empty;
                    string extension = string.Empty;
                    string fileName = "Informe";
                    byte[] bytes = ReportViewer1.LocalReport.Render("PDF", null, out mimeType, out encoding, out extension, out streamIds, out warnings);
                    Response.Buffer = true;
                    Response.Clear();
                    Response.ContentType = mimeType;
                    Response.AddHeader("content-disposition", "attachment; filename=" + fileName + "." + extension);
                    Response.BinaryWrite(bytes); // create the file
                    Response.Flush(); // send it to the client to download
                }
                else
                {
                    MuestraMensaje("No hay informes asociados a la Empresa. No se puede generar el Informe");
                }
            }
        }
        private void MuestraMensaje(string Mensaje)
        {
            StringBuilder SB = new StringBuilder();
            SB.Append("alert('");
            SB.Append(Mensaje.Replace("\n", "\\n").Replace("\r", "").Replace("'", "\\'"));
            SB.Append("');");
            ScriptManager.RegisterStartupScript(this, this.GetType(), "Success", SB.ToString(), true);
        }
    }
}